package com.gdlgxy.oa.bean;


import java.util.Date;
import java.util.TreeMap;

public class FareList implements SystemList{
    /**
     * 该记录是谁的学生
     */
    private int Sno;

    /**
     * 首节点
     */
    private Fare first;

    /**
     * 当前链表的支出类型
     */
    private TreeMap<Integer, String> map;

    /**
     * 指示当前链表是否删除
     */
    private boolean del = false;


    /**
     * 创建学生的支出链表
     *
     * @param map 传入当前支出对应的所有支出的类型
     * @param Sno 传入当前支出对应的学生编号
     */
    public FareList(int Sno, TreeMap map) {
        setSno(Sno);
        setFirst(new Fare(0, 1, 1, new Date(), ""));
        setMap(map);
    }

    /**
     * 添加学生记录的方法
     *
     * @param fare
     */
    public void fareAdd(Fare fare) {
        // 缓冲变量
        Fare temp = getFirst();

        while (null != temp.getNext()) {
            temp = temp.getNext();
        }
        temp.setNext(fare);

    }

    /**
     * 删除学生
     *
     * @param no 删除学生的编号
     */
    public void fareDel(int no) {
        // 缓冲遍历
        Fare temp = first;

        while (true) {
            // 如果下一个节点是null，说明没有删除的节点
            if (temp.getNext() == null) {
                throw new RuntimeException("删除链表错误，没有" + no + "记录节点");
            } else if (temp.getNext().getFno() == no) {
                // 执行到这里，说明下一个节点是删除的节点
                temp.setNext(temp.getNext().getNext());
                del = true;
                break;
            }
            temp = temp.getNext();
        }
    }

    /**
     * 遍历链表，查询删除的节点（只能删除一个）
     * 演示：找到删除的节点（效率过低）
     *
     * @param list 删除前的学生支出记录
     * @return 删除的记录编号
     */
    public int findFaretDel(FareList list) {
        // 当前删除了节点的链表
        Fare dtemp = first.getNext();
        // 还没有删除的节点链表
        Fare ytemp = list.first.getNext();

        while (null != dtemp) {
            if (dtemp.getFno() == ytemp.getFno()) {
                dtemp = dtemp.getNext();
                ytemp = ytemp.getNext();
            } else {
                break;
            }
        }
        return ytemp.getFno();
    }

    /**
     * 只知道支出类型与备注，不知道编号与自动生成金额
     * 自动编号，将其添加到学生链表中
     */
    public void fnameAdd(int kno, String remark) {
        int no;
        // 如果当前没有支出，则编号为1
        if (null == first.getNext()) {
            no = 1;
        } else {
            // 遍历单向链表到最后一个节点
            Fare temp = first.getNext();
            while (null != temp.getNext()) {
                temp = temp.getNext();
            }
            // 执行到这里，说明当前节点是最后一个节点
            // 获取其编号+1就是下一个节点编号
            no = (temp.getFno()) + 1;
        }
        // 添加学生
        fareAdd(new Fare(no, kno, new Date(), remark));
    }

    /**
     * 只知道支出类型与金额与备注，不知道编号
     * 自动编号，将其添加到学生链表中
     */
    public void fnameAdd(int kno, double money, String remark) {
        int no;
        // 如果当前没有支出，则编号为1
        if (null == first.getNext()) {
            no = 1;
        } else {
            // 遍历单向链表到最后一个节点
            Fare temp = first.getNext();
            while (null != temp.getNext()) {
                temp = temp.getNext();
            }
            // 执行到这里，说明当前节点是最后一个节点
            // 获取其编号+1就是下一个节点编号
            no = (temp.getFno()) + 1;
        }
        // 添加学生
        fareAdd(new Fare(no, kno, money, new Date(), remark));
    }

    /**
     * 获取支出链表的最后一个节点
     *
     * @return 链表的最后一个节点
     */
    public Fare fareLast() {
        // 遍历单向链表到最后一个节点
        Fare temp = first.getNext();
        while (null != temp.getNext()) {
            temp = temp.getNext();
        }
        return temp;
    }

    /**
     * 根据编号查询支出，返回支出节点
     * @return 支出节点
     */
    public Fare fareFind(int no){
        Fare temp = first.getNext();

        while (temp.getFno()!=no){
            temp=temp.getNext();
        }
        // 执行到这里，说明当前节点为查找的节点
        return temp;
    }

    /**
     * 遍历链表，查询修改的节点（只能修改一个）
     * 演示：找到修改的节点（效率过低）
     * @param list 修改前的支出链表
     * @return
     */
    public Fare findFareUpdate(FareList list){
        // 当前修改了节点的链表
        Fare dtemp = first.getNext();
        // 还没有修改的节点链表
        Fare ytemp = list.getFirst().getNext();

        while (null != dtemp) {
            if (dtemp.equals(ytemp)) {
                dtemp = dtemp.getNext();
                ytemp = ytemp.getNext();
            } else {
                break;
            }
        }
        return dtemp;
    }


    public Fare getFirst() {
        return first;
    }

    public void setFirst(Fare first) {
        this.first = first;
    }

    public TreeMap<Integer, String> getMap() {
        return map;
    }

    public void setMap(TreeMap<Integer, String> map) {
        this.map = map;
    }

    public int getSno() {
        return Sno;
    }

    public void setSno(int sno) {
        Sno = sno;
    }
}
